<!doctype html>
<html lang="en" class="page-type-section">
<head prefix="og: http://ogp.me/ns#">
<meta charset="utf-8">
<title>2.0 RC2 - FreeMarker 手册</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="format-detection" content="telephone=no">
<meta property="og:site_name" content="FreeMarker 手册">
<meta property="og:title" content="2.0 RC2">
<meta property="og:locale" content="en_US">
<meta property="og:url" content="http://freemarker.org/docs/versions_2_0RC2.html">
<link rel="canoical" href="http://freemarker.org/docs/versions_2_0RC2.html">
<link rel="icon" href="favicon.png" type="image/png">
<link rel="stylesheet" type="text/css" href="docgen-resources/docgen.min.css">
</head>
<body itemscope itemtype="https://schema.org/Code">
    <meta itemprop="url" content="http://freemarker.org/docs/">
    <meta itemprop="name" content="FreeMarker 手册">

  <!--[if lte IE 9]>
  <div style="background-color: #C00; color: #fff; padding: 12px 24px;">Please use a modern browser to view this website.</div>
  <![endif]--><div class="header-top-bg"><div class="site-width header-top"><a class="logo" href="http://freemarker.org" role="banner">            <img itemprop="image" src="logo.png" alt="FreeMarker">
</a><ul class="tabs"><li><a href="http://freemarker.org/">Home</a></li><li class="current"><a href="index.html">Manual</a></li><li><a class="external" href="http://freemarker.org/docs/api/index.html">Java API</a></li></ul><ul class="secondary-tabs"><li><a class="tab icon-heart" href="http://freemarker.org/contribute.html" title="Contribute"><span>Contribute</span></a></li><li><a class="tab icon-bug" href="https://sourceforge.net/p/freemarker/bugs/new/" title="Report a Bug"><span>Report a Bug</span></a></li><li><a class="tab icon-download" href="http://freemarker.org/freemarkerdownload.html" title="Download"><span>Download</span></a></li></ul></div></div><div class="header-bottom-bg"><div class="site-width search-row"><a href="toc.html" class="navigation-header">Manual</a><div class="navigation-header"></div></div><div class="site-width breadcrumb-row"><ul class="breadcrumb" itemscope itemtype="http://schema.org/BreadcrumbList"><li class="step-0" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="toc.html"><span itemprop="name">FreeMarker 手册</span></a></li><li class="step-1" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="app.html"><span itemprop="name">附录</span></a></li><li class="step-2" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="app_versions.html"><span itemprop="name">版本历史</span></a></li><li class="step-3" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="versions_2_0RC2.html"><span itemprop="name">2.0 RC2</span></a></li></ul><div class="bookmarks" title="Bookmarks"><span class="sr-only">Bookmarks:</span><ul class="bookmark-list"><li><a href="alphaidx.html">Alpha. index</a></li><li><a href="gloss.html">Glossary</a></li><li><a href="dgui_template_exp.html#exp_cheatsheet">Expressions</a></li><li><a href="ref_builtins_alphaidx.html">?builtins</a></li><li><a href="ref_directive_alphaidx.html">#directives</a></li><li><a href="ref_specvar.html">.spec_vars</a></li><li><a href="app_faq.html">FAQ</a></li></ul></div></div></div>    <div class="main-content site-width">
      <div class="content-wrapper">
  <div id="table-of-contents-wrapper" class="col-left">
      <script>var breadcrumb = ["FreeMarker 手册","附录","版本历史","2.0 RC2"];</script>
      <script src="toc.js"></script>
      <script src="docgen-resources/main.min.js"></script>
  </div>
<div class="col-right"><div class="page-content"><div class="page-title"><div class="pagers top"><a class="paging-arrow previous" href="versions_2_0RC3.html"><span>Previous</span></a><a class="paging-arrow next" href="versions_2_0RC1.html"><span>Next</span></a></div><div class="title-wrapper">
<h1 class="content-header header-section1" id="versions_2_0RC2" itemprop="headline">2.0 RC2</h1>
</div></div><div class="page-menu">
<div class="page-menu-title">Page Contents</div>
<ul><li><a class="page-menu-link" href="#autoid_268" data-menu-target="autoid_268">Changes to Template Language</a></li><li><a class="page-menu-link" href="#autoid_269" data-menu-target="autoid_269">API Changes</a></li></ul> </div><p>FreeMarker 2.0 RC 2 was released on 4 April 2002. Here is a
        summary of changes wrt to the first release.</p>
          



<h2 class="content-header header-section2" id="autoid_268">Changes to Template Language</h2>


          <ul>
            <li>
              <p>Certain built-in functionality is provided via a new
              operator, &#39;?&#39;. Thus, <code class="inline-code">myList?size</code> provides the
              number of elements in a list. Similarly,
              <code class="inline-code">myString?length</code> provides the length of a
              string, <code class="inline-code">myString?upper_case</code> puts the string
              all in capital letters, and <code class="inline-code">myHash?keys</code>
              provides a sequence containing the keys in the hash. See <a href="ref_builtins.html">模板语言参考 /内建函数参考</a> for list of all available
              built-ins.</p>
            </li>

            <li>
              <p>Numerical comparisons can now be made using the &quot;natural&quot;
              operators &lt; and &gt; but there are also &quot;web-safe&quot;
              alternatives, such as <em>\lt</em> and
              <em>\gt</em>, since the use of these characters may
              confuse HTML editors and parsers. Note that these changed
              between rc1 and rc2, they now start with a backslash. A little
              asymmetry is the fact that if you use the natural greater-than
              or greater-than-or-equals operators (i.e. &gt; or &gt;=) the
              expression must be in parentheses. With any other operator, the
              parentheses are optional.</p>
            </li>

            <li>
              <p>Within an iteration loop -- i.e. a
              <code class="inline-code">foreach</code> or a <code class="inline-code">list</code> block --
              the current count in the loop is available as the special
              variable
              <code class="inline-code"><em class="code-color">index</em>_count</code>. where
              <em>index</em> is the name of the variable in
              the iteration. A boolean variable called
              <code class="inline-code"><em class="code-color">index</em>_has_next</code> is
              also defined that indicates whether there are any more items in
              the iteration after this one. Note that the index starts at
              zero, so you will often be adding one to it in practice.</p>
            </li>

            <li>
              <p>The <code class="inline-code">&lt;#break&gt;</code> directive can now be
              used to break out of a <code class="inline-code">&lt;#foreach...&gt;</code> or
              a <code class="inline-code">&lt;list...&gt;</code> loop. (Prior to this
              version, it only worked within a switch-case block.) There is a
              new directive called <code class="inline-code">&lt;#stop&gt;</code> that, when
              encountered, simply halts processing of the template. This can
              be useful for debugging purposes.</p>
            </li>

            <li>
              <p>When invoking java methods that have been exposed to the
              page, using the code in freemarker.ext.*, there are built-ins
              that allow you to indicate the numerical type that you wish to
              pass as the value. For instance, if you had two methods, one
              that takes an int and another that takes a long, and you wanted
              to pass in a value, you would have to specify which method.
              <code class="inline-code">myMethod(1?int)</code> or
              <code class="inline-code">myMethod(1?long)</code>. This is unnecessary if
              there is only one method of the given name.</p>
            </li>

            <li>
              <p>Ranges can be used to get the sublist from a list or the
              substring of a string. For example:
              <code class="inline-code">myList[0..3]</code> will return items 0 through 3 of
              the list in question. Or, for example, you could get all the
              elements of the list except for the first and last ones via:
              <code class="inline-code">myList[1..(myList?size-2)]</code></p>
            </li>

            <li>
              <p>Or we could get the first 6 characters of a string via
              <code class="inline-code">myString[0..5]</code></p>
            </li>

            <li>
              <p>Lists can be concatenated using the &#39;+&#39; operator.
              Previously, this overloading of &#39;+&#39; only applied to
              strings.</p>
            </li>

            <li>
              <p>An attempt to compare a number to a string now throws an
              exception, since it is indicative of a coding error. Note that
              there is a backward compatibility mode that can be set (see
              below) that loosens this up in order to be able to process
              legacy templates.</p>
            </li>
          </ul>
        
          



<h2 class="content-header header-section2" id="autoid_269">API Changes</h2>


          <ul>
            <li>
              <p>The <code class="inline-code">TemplateSequenceModel</code> interface now
              has a <code class="inline-code">size()</code> method for getting the number of
              elements in the sequence in question.</p>
            </li>

            <li>
              <p>The <code class="inline-code">TemplateModelIterator</code> interface now
              has a <code class="inline-code">hasNext()</code> method.</p>
            </li>

            <li>
              <p>The default sequence and hash implementations,
              <code class="inline-code">freemarker.template.SimpleSequence</code> and
              <code class="inline-code">freemarker.template.SimpleHash</code> are now
              unsynchronized. If you need the methods to be synchronized, you
              can get a synchronized wrapper via the
              <code class="inline-code">synchronizedWrapper()</code> in either class.</p>
            </li>

            <li>
              <p>The <code class="inline-code">freemarker.utility.ExtendedList</code> and
              <code class="inline-code">freemarker.utility.ExtendedHash</code> classes were
              removed, since all of the extra keys that it defined are now
              available using the appropriate &#39;?&#39; built-in operation, i.e.
              <code class="inline-code">myHash?keys</code> or <code class="inline-code">myList?size</code>
              or <code class="inline-code">myList?last</code>.</p>
            </li>

            <li>
              <p>There is a method in
              <code class="inline-code">java.freemarker.Configuration</code> named
              <code class="inline-code">setDebugMode()</code> which allows you to decide
              whether stack traces are simply output to the web client (the
              best situation in development) or thrown back to the caller to
              be handled more gracefully (the best situation in
              production).</p>
            </li>

            <li>
              <p>There is a flag that can be set to turn on a processing
              mode that is more backward-compatible with FreeMarker Classic.
              This is off by default, but you can set it via
              <code class="inline-code">Template.setClassicCompatibility(true)</code>. What
              this does is that it allows scalars to be treated as a
              single-item list in a list directive. Also, it allows somewhat
              more looseness about types. In FreeMarker 1.x, <code class="inline-code">&lt;#if
              x==&quot;1&quot;&gt;</code> and <code class="inline-code">&lt;#if x==1&gt;</code>
              were in fact equivalent. This meant that legacy templates might
              tend to be slack about this. If classic compatibility is not
              set, an attempt to compare the string &quot;1&quot; with the number 1 will
              result in an exception being thrown. (Note that it is preferable
              to get your templates working without the backward compatibility
              flag, since it usually will require only minor changes. However,
              for people with a lot of templates and no time to check over
              them, this flag may be of use.)</p>
            </li>
          </ul>
        <div class="bottom-pagers-wrapper"><div class="pagers bottom"><a class="paging-arrow previous" href="versions_2_0RC3.html"><span>Previous</span></a><a class="paging-arrow next" href="versions_2_0RC1.html"><span>Next</span></a></div></div></div></div>      </div>
    </div>
<div class="site-footer"><div class="site-width"><div class="footer-top"><div class="col-left sitemap"><div class="column"><h3 class="column-header">Overview</h3><ul><li><a href="http://freemarker.org/index.html">What is FreeMarker?</a></li><li><a href="http://freemarker.org/freemarkerdownload.html">Download</a></li><li><a href="app_versions.html">Version history</a></li><li><a href="http://freemarker.org/history.html">About us</a></li><li><a itemprop="license" href="app_license.html">License</a></li></ul></div><div class="column"><h3 class="column-header">Handy stuff</h3><ul><li><a href="http://freemarker-online.kenshoo.com/">Try template online</a></li><li><a href="dgui_template_exp.html#exp_cheatsheet">Expressions cheatsheet</a></li><li><a href="ref_directive_alphaidx.html">#directives</a></li><li><a href="ref_builtins_alphaidx.html">?built_ins</a></li><li><a href="ref_specvar.html">.special_vars</a></li></ul></div><div class="column"><h3 class="column-header">Community</h3><ul><li><a href="https://github.com/nanlei/freemarker/tree/manual-zh-2.3-gae/src/manual">Chinese Manual on Github</a></li><li><a href="https://github.com/freemarker/freemarker">FreeMarker on Github</a></li><li><a href="https://twitter.com/freemarker">Follow us on Twitter</a></li><li><a href="https://sourceforge.net/p/freemarker/bugs/new/">Report a bug</a></li><li><a href="http://stackoverflow.com/questions/ask?tags=freemarker">Ask a question</a></li><li><a href="http://freemarker.org/mailing-lists.html">Mailing lists</a></li></ul></div></div><div class="col-right"><ul class="social-icons"><li><a class="github" href="https://github.com/freemarker/freemarker">Github</a></li><li><a class="twitter" href="https://twitter.com/freemarker">Twitter</a></li><li><a class="stack-overflow" href="http://stackoverflow.com/questions/ask?tags=freemarker">Stack Overflow</a></li></ul><a class="xxe" href="http://www.xmlmind.com/xmleditor/" rel="nofollow" title="Edited with XMLMind XML Editor"><span>Edited with XMLMind XML Editor</span></a></div></div><div class="footer-bottom"><p><span class="generated-for-product">Generated for: Freemarker 2.3.23</span><span class="last-updated"> Last generated:
<time itemprop="dateModified" datetime="2015-09-18T14:38:51Z" title="Friday, September 18, 2015 2:38:51 PM GMT">2015-09-18 14:38:51 GMT</time></span></p> <p class="copyright">
© <span itemprop="copyrightYear">1999</span>–2015
<a itemtype="http://schema.org/Organization" itemprop="copyrightHolder" href="http://freemarker.org">The FreeMarker Project</a>. All rights reserved. </p>
</div></div></div></body>
</html>
